IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spOrdenesDeCompra' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spOrdenesDeCompra]
END
GO
CREATE PROCEDURE [dbo].[spOrdenesDeCompra]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL   /* PARAMETRO AUXILIAR */
	,@Id INT=NULL
	,@NumOrden VARCHAR(16)=NULL
	,@DescripcionOrden VARCHAR(256)=NULL
	,@EstadoOrden VARCHAR(8)=NULL
	,@FechaCreacionOrden VARCHAR(16)=NULL
	,@ValorOrden NUMERIC(18,2)=NULL
	,@CodProveedor VARCHAR(16)=NULL
	,@NombreProveedor VARCHAR(128)=NULL
	,@Almacen VARCHAR(8)=NULL
	,@CodAnalistaCompra VARCHAR(16)=NULL
	,@DESCRIPCION VARCHAR(256)=NULL
WITH ENCRYPTION
AS
SET NOCOUNT ON
BEGIN TRY

DECLARE @AUX VARCHAR(2048)
DECLARE @indice	INTEGER		-- Esta variable es necesaria para mapear el XML

/*****     OPERACION POR DEFECTO    *****/
IF @OP IS NULL OR @OP = ''
BEGIN
	SELECT
		t.*
	FROM
		[dbo].[OrdenesDeCompra] t
	ORDER BY
		t.numorden DESC
	RETURN 0
END


/*****     OBTENER LA ULTIMA ORDEN DE COMPRA    *****/
IF @OP = 'ObtenerUltimaOC'
BEGIN
	
	-- Elimino las ordenes de los ultimos 15 dias para que se actulice la infromacion de las mismas
	SET @AUX=CONVERT(VARCHAR(10),DATEADD(DAY,ISNULL(@Id,15)*-1,GETDATE()),111)
	SET @AUX='1'+SUBSTRING(@AUX,3,2)+SUBSTRING(@AUX,6,2)+SUBSTRING(@AUX,9,2)
	DELETE FROM [OrdenesDeCompra] WHERE FechaCreacionOrden>@AUX
	
	-- Devuelvo el codigo de la ultima orden registrada
	SELECT
		MAX(t.NumOrden) as NumOrden
	FROM
		[dbo].[OrdenesDeCompra] t
	RETURN 0
END

/*****     IMPORTAR ORDENES DE COMPRA DESDE INFOR   *****/
IF @OP = 'ImportarOrdenesDeCompra'
BEGIN
	BEGIN TRANSACTION
	
	-- Obtengo las Ordenes de Compra del XML y las agrego a la tabla que corresponde
	EXEC sp_xml_preparedocument @indice OUTPUT, @ParamAuxiliar
	insert into OrdenesDeCompra
		(NumOrden,DescripcionOrden,EstadoOrden,FechaCreacionOrden,ValorOrden,CodProveedor,NombreProveedor,Almacen,CodAnalistaCompra,DESCRIPCION)
	SELECT
		NumOrden,DescripcionOrden,EstadoOrden,FechaCreacionOrden,ValorOrden,CodProveedor,NombreProveedor,Almacen,CodAnalistaCompra,DESCRIPCION
	FROM 
		OPENXML(@indice,'/DocumentElement/XML_TABLE',2)WITH (
				 NUMORDEN VARCHAR(16)
				,DESCRIPCIONORDEN VARCHAR(256)
				,ESTADOORDEN VARCHAR(8)
				,FECHACREACIONORDEN VARCHAR(16) 
				,VALORORDEN NUMERIC(18,2)
				,CODPROVEEDOR VARCHAR(16)
 				,NOMBREPROVEEDOR VARCHAR(128)
				,ALMACEN VARCHAR(8)
				,CODANALISTACOMPRA VARCHAR(16)
				,DESCRIPCION VARCHAR(256)
			)
	EXEC sp_xml_removedocument @indice	
	
	COMMIT TRANSACTION
	RETURN 0
END	



--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
	BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END

--- CONTROLAR Y REGISTRAR LOS ERRORES
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ISNULL(ERROR_PROCEDURE(),OBJECT_NAME(@@PROCID)),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(2048)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error
	EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1
END CATCH;
